package com.xtoad.ecms.baseinfo.service.impl;

import com.xtoad.ecms.baseinfo.converter.MenuConverter;
import com.xtoad.ecms.baseinfo.dto.MenuDTO;
import com.xtoad.ecms.baseinfo.model.Menu;
import com.xtoad.ecms.baseinfo.repository.IMenuRepository;
import com.xtoad.ecms.baseinfo.service.IMenuService;
import com.xtoad.ecms.common.web.exception.BusinessException;
import com.xtoad.ecms.common.web.exception.ResultCodeEnum;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;

/**
 * 菜单类服务实现类
 *
 * @author xtoad
 * @date 2021/01/18
 */
@Service
public class MenuServiceImpl implements IMenuService {

    @Resource
    private IMenuRepository menuRepository;
    @Resource
    private MenuConverter menuConverter;

    /**
     * 根据id查询菜单类
     *
     * @param id 菜单类id
     * @return 查询结果
     */
    @Override
    public MenuDTO getMenuById(final Long id) {
        Optional<Menu> menu = menuRepository.findById(id);
        if (menu.isPresent()) {
            return menuConverter.toDto(menu.get());
        }

        throw new BusinessException(ResultCodeEnum.NOT_FOUND);
    }

    /**
     * 查询全部菜单类，不分页
     *
     * @return 查询结果
     */
    @Override
    public List<MenuDTO> getAllMenu() {
        List<Menu> allMenus = this.menuRepository.findAll();
        return menuConverter.toDtoList(allMenus);
    }

    /**
     * 新增菜单类
     *
     * @param menuDTO 保存对象
     * @return 新增结果
     */
    @Override
    public MenuDTO insert(final MenuDTO menuDTO) {
        Menu menu = menuConverter.toModel(menuDTO);
        menu = menuRepository.save(menu);

        return menuConverter.toDto(menu);
    }

    /**
     * 删除菜单类
     *
     * @param id 删除对象id
     */
    @Override
    public void deleteById(final Long id) {
        menuRepository.deleteById(id);
    }

    /**
     * 删除菜单类
     *
     * @param menuDTO 删除对象
     */
    @Override
    public void delete(final MenuDTO menuDTO) {
        Menu menu = menuConverter.toModel(menuDTO);
        menuRepository.delete(menu);
    }

    /**
     * 更新菜单类
     *
     * @param menuDTO 更新对象
     * @return 更新结果
     */
    @Override
    public MenuDTO update(final MenuDTO menuDTO) {
        Menu menu = menuConverter.toModel(menuDTO);
        menu = menuRepository.save(menu);

        return menuConverter.toDto(menu);
    }

    /**
     * 批量新增菜单类
     *
     * @param menuDTOList 新增对象
     * @return 新增结果
     */
    @Override
    public List<MenuDTO> batchInsert(final List<MenuDTO> menuDTOList) {
        List<Menu> menus = menuConverter.toModelList(menuDTOList);
        menus = menuRepository.saveAll(menus);

        return menuConverter.toDtoList(menus);
    }

    /**
     * 批量删除菜单类
     *
     * @param menuDTOList 删除对象
     */
    @Override
    public void batchDelete(final List<MenuDTO> menuDTOList) {
        List<Menu> menus = menuConverter.toModelList(menuDTOList);
        menuRepository.deleteInBatch(menus);
    }

    /**
     * 批量更新菜单类
     *
     * @param menuDTOList 更新对象
     * @return 更新结果
     */
    @Override
    public List<MenuDTO> batchUpdate(final List<MenuDTO> menuDTOList) {
        List<Menu> menus = menuConverter.toModelList(menuDTOList);
        menus = menuRepository.saveAll(menus);

        return menuConverter.toDtoList(menus);
    }

}
